package com.serkol.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

@Aspect
@Component
public class OperationLogAspect {
    private ThreadLocal<SimpleDateFormat> format = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    //切点表达式，表示加了OperationLog注解的都是切点，路径是自定义注解的全路径
    @Pointcut("@annotation(OperationLog)")
    public void pointcut() {

    }

    @Around("@annotation(operationLog)")
    public Object operationLogRecord(ProceedingJoinPoint joinPoint, OperationLog operationLog) {
        //获取请求
 //  HttpServletRequest request = ((HttpServletRequest) RequestContextHolder.getRequestAttributes());
        //响应
        Object responseResult = null;
        //判断原方法是否正常执行的标志
        boolean isNormalProcess = false;
        //执行数据库操作，将信息保存到数据库，笔者这里使用的是mongodb，仅供参考，主要看获取自定义注解里面的值
        StringBuffer document = new StringBuffer();
        //获取自定义注解里面的值
        document.append(operationLog.module());
        document.append(operationLog.type());
        document.append( operationLog.user());
        document.append( operationLog.operation());
        System.out.println(document.toString());
        try {
            //返回切点处继续执行原方法，并接收原方法的响应
            responseResult = joinPoint.proceed();
            //如果顺利执行，那么说明原方法执行正常，就可以进行日志记录。因为，如果原方法的增删改出问题了，那么日志就不需要记录了，不用记录失败的操作。
            isNormalProcess = true;
        } catch (Throwable e) {
            System.out.println("原方法报错，不需要记录日志");
        }


            System.out.println("保存操作日志出错");


        return responseResult;
    }

}